約 115,595 件
https://w.atwiki.jp/eco_yotuba/pages/7.html
アーカイブ @wikiのwikiモードでは #archive_log() と入力することで、特定のウェブページを保存しておくことができます。 詳しくはこちらをご覧ください。 =>http //atwiki.jp/guide/25_171_ja.html たとえば、#archive_log()と入力すると以下のように表示されます。 保存したいURLとサイト名を入力して"アーカイブログ"をクリックしてみよう サイト名 URL
https://w.atwiki.jp/eco_yotuba/pages/44.html
更新していってもだんだん移動してたとかで違ってくるのが難点だね - 名無しさん 2013-06-14 00 29 33
https://w.atwiki.jp/sqlpuzzle/pages/25.html
問題 在庫の部品残数を累計的に求める req_date | req_qty | req_onhand_qty | -----------+---------+----------------+ 1994-07-01 | 100 | 100 | 1994-07-02 | 120 | 220 | 1994-07-03 | -150 | 70 | 1994-07-04 | 50 | 120 | 1994-07-05 | -35 | 85 | fumikoの回答 SQL文 SELECT a1.req_date, sum(a2.req_qty) as req_onhand_qty FROM InventoryAdjustments as a1,InventoryAdjustments as a2 WHERE a1.req_date = a2.req_date GROUP BY a1.req_date 考え方 2つのテーブルa1,a2を用意 a1の日付 =a2の日付の条件で組み合わせる (↓group byする前の状態。select a1.req_date,a2.req_qtyとしたとき) a1date | a2qty -----------+------- 1994-07-01 | 100 1994-07-02 | 100 1994-07-02 | 120 1994-07-03 | 100 1994-07-03 | 120 1994-07-03 | -150 1994-07-04 | 100 1994-07-04 | 120 1994-07-04 | -150 1994-07-04 | 50 1994-07-05 | 100 1994-07-05 | 120 1994-07-05 | -150 1994-07-05 | 50 1994-07-05 | -35 日付ごとにグループ化して合計を求める 実行結果 req_date | req_onhand_qty ----------+---------------- 1994-07-01 | 100 1994-07-02 | 220 1994-07-03 | 70 1994-07-04 | 120 1994-07-05 | 85 satomiの回答 SQL文 SELECT I1.req_date,I1.req_qty,(SELECT SUM(req_qty) FROM InventoryAdjustments I2 WHERE I1.req_date =I2.req_date)as req_onhand_qty FROM InventoryAdjustments I1; 考え方 SELECT節の副問合わせを考える。自己結合を使う 1994-07-01→1994-07-01 1994-07-02→1994-07-01,1994-07-02...... このように、I1.req_dateと日付が同じかそれ以前の、要求数量の合計を計算する。 InventoryAdjustments I1から要求日、要求数量、累計を求める。 実行結果 ------------+---------+----------------+ req_date | req_qty | req_onhand_qty | -----------+---------+----------------+ 1994-07-01 | 100 | 100 | 1994-07-02 | 120 | 220 | 1994-07-03 | -150 | 70 | 1994-07-04 | 50 | 120 | 1994-07-05 | -35 | 85 | おさらい PostgreSQLで解1と解2のコストを計算してみました。 解1の処理コスト QUERY PLAN -------------------------------------------------------------------------------- -------------------------------------------------------------------------- Index Scan using inventoryadjustments_pkey on inventoryadjustments a1 (cost=0. 00..56302.10 rows=1940 width=8) (actual time=0.332..0.543 rows=5 loops=1) SubPlan - Aggregate (cost=28.97..28.98 rows=1 width=4) (actual time=0.053..0.054 rows=1 loops=5) - Bitmap Heap Scan on inventoryadjustments a2 (cost=9.26..27.35 ro ws=647 width=4) (actual time=0.016..0.021 rows=3 loops=5) Recheck Cond (req_date = $0) - Bitmap Index Scan on inventoryadjustments_pkey (cost=0.00. .9.10 rows=647 width=0) (actual time=0.009..0.009 rows=3 loops=5) Index Cond (req_date = $0) Total runtime 0.811 ms (8 行) 解2の処理コスト QUERY PLAN -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- --- GroupAggregate (cost=0.00..47677.40 rows=200 width=12) (actual time=0.106..0.2 63 rows=5 loops=1) - Nested Loop (cost=0.00..38265.91 rows=1254533 width=12) (actual time=0.0 45..0.184 rows=15 loops=1) - Index Scan using inventoryadjustments_pkey on inventoryadjustments a1 (cost=0.00..77.35 rows=1940 width=8) (actual time=0.022..0.033 rows=5 loops= 1) - Index Scan using inventoryadjustments_pkey on inventoryadjustments a2 (cost=0.00..11.60 rows=647 width=8) (actual time=0.005..0.012 rows=3 loops=5 ) Index Cond (a2.req_date = a1.req_date) Total runtime 0.464 ms (6 行) GROUP BYを使った解2より、サブクエリを使った解1のほうが早いはずですが・・・以上より、解2の方がコストが低いってなぜですかね* ̄O ̄)ノ
https://w.atwiki.jp/eco_yotuba/pages/11.html
コメントプラグイン @wikiのwikiモードでは #comment() と入力することでコメントフォームを簡単に作成することができます。 詳しくはこちらをご覧ください。 =>http //atwiki.jp/guide/17_60_ja.html たとえば、#comment() と入力すると以下のように表示されます。 名前 コメント
https://w.atwiki.jp/aisz/pages/20.html
ホーム
https://w.atwiki.jp/softy/pages/24.html
2.「整数型変数a,bを宣言し、それぞれの値を標準入力から入力し、その和を出力するプログラムを作成せよ。」 教科書に載っている、入力結果をそのまま出力するプログラムは大体以下の通りですが、 stdio.h int main() { int a, b; printf("An example of scanf().\n"); printf("a "); scanf("%d", a); printf("b "); scanf("%d", b); printf("/* hogehoge */", /* 和を出力したい場合は、ここを変更すればおkです。 */); } printfの内容を変更するほかにも、途中でaとbを足すという方法もあります。 てすてす stdio.h int main()
https://w.atwiki.jp/sqlpuzzle/pages/36.html
問題 各仕事に対するコンサルタントの名前と請求金額を求めたい。請求金額は書く労働時間と時給をかけると求められるが、コンサルタントの時給は期間によって変化する。 Consultants emp_id | emp_name --------+------------ 1 | Larry 2 | Moe 3 | Curly Billings emp_id | bill_date | bill_rate --------+------------+----------- 1 | 1990-01-01 | 25.00 2 | 1989-01-01 | 15.00 3 | 1989-01-01 | 20.00 1 | 1991-01-01 | 30.00 hoursworked job_id | emp_id | work_date | bill_hrs --------+--------+------------+-------------------------------- 4 | 1 | 1990-07-01 | 3.00 4 | 1 | 1990-08-01 | 5.00 4 | 2 | 1990-07-01 | 2.00 4 | 1 | 1991-07-01 | 4.00 Consultants:コンサルタントテーブル Emp_id:社員ID emp_name 社員名 Billings 請求書テーブル bill_date 請求日 bill_rate 時給 Hoursworked 実働時間テーブル job_id 実働ID work_date 実働日 bill_hrs 実働時間 chiakiの解答 考え方 1つ目のビューで、実働日が請求日より後にある場合の、社員名・請求日・時給・実働日・実働時間を求める。 2つ目のビューで、前に作ったビューを社員名と実働日でグループ化し、社員名・請求日の最大値・実働日を求める。 最後に、上の二つのビューを使って、給料合計を求める。 SQL文 ①1つ目のビュー CREATE VIEW Consultants2 (emp_id, emp_name, bill_date, bill_rate, bill_hrs, work_date) AS SELECT C.emp_id, C.emp_name, B.bill_date, B.bill_rate, H.bill_hrs, H.work_date FROM Consultants C, Billings B, HoursWorked H WHERE H.emp_id = C.emp_id AND H.emp_id = B.emp_id AND H.work_date = B.bill_date; emp_id | emp_name | bill_date | bill_rate | bill_hrs | work_date --------+------------+------------+-----------+----------+------------ 1 | Larry | 1990-01-01 | 25.00 | 3.00 | 1990-07-01 1 | Larry | 1990-01-01 | 25.00 | 5.00 | 1990-08-01 1 | Larry | 1990-01-01 | 25.00 | 4.00 | 1991-07-01 1 | Larry | 1991-01-01 | 30.00 | 4.00 | 1991-07-01 2 | Moe | 1989-01-01 | 15.00 | 2.00 | 1990-07-01 ②2つ目のビュー CREATE VIEW Consultants3 (name, bd, wd) AS SELECT C2.emp_name AS NAME, max(C2.bill_date) AS BD, C2.work_date AS WD FROM Consultants2 C2 GROUP BY C2.emp_name, C2.work_date; name | bd | wd ------------+------------+------------ Larry | 1990-01-01 | 1990-07-01 Larry | 1990-01-01 | 1990-08-01 Larry | 1991-01-01 | 1991-07-01 Moe | 1989-01-01 | 1990-07-01 SELECT C2.emp_name, SUM(C2.bill_rate*C2.bill_hrs) FROM Consultants2 C2, Consultants3 C3 WHERE C2.emp_name = C3.name AND C2.bill_date = C3.bd AND C2.work_date = C3.wd GROUP BY C2.emp_name; 結果 emp_name | sum ------------+---------- Larry | 320.0000 Moe | 30.0000 (2 行) satomiの解答 考え方 副問い合わせで、実働日以前の直近の請求日を選ぶ emp_nameでグループ化し、該当する請求日の時給と、実働時間をかけた合計を求める。 SQL文 select c.emp_name,sum(h.bill_hrs*b.bill_rate) from consultants c,billings b,hoursworked h where c.emp_id=b.emp_id and c.emp_id=h.emp_id and b.bill_date=(select max(b1.bill_date) from billings b1,hoursworked h1 where h.work_date b1.bill_date and b1.emp_id=h1.emp_id and h1.emp_id=h.emp_id group by h1.emp_id) group by c.emp_name; 結果 emp_name | sum ------------+---------------------- Moe | 30.0000 Larry | 320.0000
https://w.atwiki.jp/sqlpuzzle/pages/39.html
問題 fooの数量、barの数量を計算書番号ごとに出す accounts foo bar 答え acct_nbr acct_nbr | bar_qty acct_nbr | bar_qty |foo_qty|bar_qty ----------- --------+-------- ---------+--------- -------------------- 1 2 | 160 2 | 160 → 1| 10 | 0 2 3 | 320 3 | 320 2| 60 | 160 3 3 | 640 3 | 640 3| 80 | 961 4 3 | 1 3 | 1 4| 0 | 0 サンプルコード↓これ以外を考えよう♪ select a.acct_nbr, coalesce(f.foo_qty,0) as foo_qty_tot, coalesce(b.bar_qty,0) as bar_qty_tot from accounts as a left outer join (select acct_nbr,sum(foo_qty) as foo_qty from foo group by acct_nbr) as f on f.acct_nbr = a.acct_nbr left outer join (select acct_nbr,sum(bar_qty) as bar_qty from bar group by acct_nbr) as b on f.acct_nbr = b.acct_nbr; COALESCE(式1,式2,式3,...)式1がNULL以外→終了、式1がNULL→式2実行。 式2がNULL→式3実行、引数で指定された式がNULL以外の値を返すまで続く 全ての式がNULL→NULLをCOALESCEの結果として返す yukaさんの回答 fumikoの回答 考え accountsのacct_nbrごとにfooからacct_nbrが同じときだけfoo_qtyを足していく barからacct_nbrが同じときだけbar_qtyを足していく SQL select ac.acct_nbr, sum(distinct case when ac.acct_nbr = foo.acct_nbr then foo_qty else 0 end), sum(distinct case when ac.acct_nbr = bar.acct_nbr then bar_qty else 0 end) from accounts as ac,foo,bar group by ac.acct_nbr 結果 acct_nbr | sum | sum ----------+-----+----- 1 | 10 | 0 2 | 60 | 160 3 | 80 | 961 4 | 0 | 0
https://w.atwiki.jp/sqlpuzzle/pages/11.html
パズル22:大家の悩み 問題について マンションの住人のうち家賃を払った人物についてのレポートを作りたいが考えたSQLではうまくいかないのでその原因と対策を説明したほしいという問題。 ちょっと問題文が読みづらくて、何を求めたいのかがよく分からなかったのですが、各部屋に対して、借主がある期間内に支払っているかもしくは支払っていないかを対応付ける表がほしいみたい。多分答えとしてほしいのはこんなのだと思われます。 +----------+-----------+--------------+--------------+ | unit_nbr | tenant_id | vacated_date | payment_date | +----------+-----------+--------------+--------------+ | 1 | 1 | NULL | 2007-03-01 | | 2 | 1 | NULL | NULL | +----------+-----------+--------------+--------------+ つまり部屋(Unit)に対して借りてる人(tenant)が期間内に払ったらpayment_dateに日付がはいって、そうでなかったらNULLになる。ということだと思われます。 (unit_nbr,tenant_id)=(1,1)はちゃんと支払われている (unit_nbr,tenant_id)=(2,1)は支払われてない ちえみんの回答 まずミックさんのサポートページからサンプルデータをもらってきましたが、 期間外に支払われた場合が存在しないのでちょっと付け足してみました。 サンプルデータ:Puzzle22 select * from Units; +------------+----------+ | complex_id | unit_nbr | +------------+----------+ | 32 | 1 | | 32 | 2 | | 32 | 3 | | 32 | 4 | +------------+----------+ select * from RentPayments; +-----------+----------+--------------+ | tenant_id | unit_nbr | payment_date | +-----------+----------+--------------+ | 1 | 1 | 2007-03-01 | | 1 | 4 | 2007-02-01 | +-----------+----------+--------------+ select * from Units; +------------+----------+ | complex_id | unit_nbr | +------------+----------+ | 32 | 1 | | 32 | 2 | | 32 | 3 | | 32 | 4 | +------------+----------+ まずは結合の内側から確認してみました。 SELECT * FROM Tenants T1 LEFT OUTER JOIN RentPayments RP1 ON T1.tenant_id = RP1.tenant_id; +-----------+----------+--------------+-----------+----------+--------------+ | tenant_id | unit_nbr | vacated_date | tenant_id | unit_nbr | payment_date | +-----------+----------+--------------+-----------+----------+--------------+ | 1 | 1 | NULL | 1 | 1 | 2007-03-01 | | 1 | 1 | NULL | 1 | 4 | 2007-02-01 | | 1 | 2 | NULL | 1 | 1 | 2007-03-01 | | 1 | 2 | NULL | 1 | 4 | 2007-02-01 | | 1 | 3 | 2007-01-01 | 1 | 1 | 2007-03-01 | | 1 | 3 | 2007-01-01 | 1 | 4 | 2007-02-01 | +-----------+----------+--------------+-----------+----------+--------------+ SELECT * FROM Tenants T1 LEFT OUTER JOIN RentPayments RP1 ON T1.tenant_id = RP1.tenant_id WHERE T1.unit_nbr = RP1.unit_nbr; +-----------+----------+--------------+-----------+----------+--------------+ | tenant_id | unit_nbr | vacated_date | tenant_id | unit_nbr | payment_date | +-----------+----------+--------------+-----------+----------+--------------+ | 1 | 1 | NULL | 1 | 1 | 2007-03-01 | +-----------+----------+--------------+-----------+----------+--------------+ 1 row in set (0.00 sec) 上の例では左外部結合の結果を示し、そのテーブルから部屋番号が共通するものを選択しています。明らかに左結合した部分が無駄になっている(汗、ていうかなにしたいかよくわかりません。 おかしなことになる原因は結合の条件であり、左結合するときの条件に部屋番号が一致する(T1.unit_nbr=RP1.unit_nbr)条件を入れる必要があります。 SELECT * FROM Tenants T1 LEFT OUTER JOIN RentPayments RP1 ON T1.tenant_id = RP1.tenant_id AND T1.unit_nbr=RP1.unit_nbr; +-----------+----------+--------------+-----------+----------+--------------+ | tenant_id | unit_nbr | vacated_date | tenant_id | unit_nbr | payment_date | +-----------+----------+--------------+-----------+----------+--------------+ | 1 | 1 | NULL | 1 | 1 | 2007-03-01 | | 1 | 2 | NULL | NULL | NULL | NULL | | 1 | 3 | 2007-01-01 | NULL | NULL | NULL | | 1 | 4 | NULL | 1 | 4 | 2007-02-01 | +-----------+----------+--------------+-----------+----------+--------------+ 4 rows in set (0.00 sec) そうすると借主が支払いをしていない部屋番号2と3はちゃんとpayment_dateがNULLになっています。 次に期間内に支払ったという条件を入れるのですが、このままでは期間内に支払ってない部屋が結果テーブルから消えてしまいます。 SELECT * FROM Tenants T1 LEFT OUTER JOIN RentPayments RP1 ON T1.tenant_id = RP1.tenant_id AND T1.unit_nbr=RP1.unit_nbr WHERE (RP1.payment_date = 2007-03-01 and RP1.payment_date 2007-03-31 ) or RP1.payment_date IS NULL; +-----------+----------+--------------+-----------+----------+--------------+ | tenant_id | unit_nbr | vacated_date | tenant_id | unit_nbr | payment_date | +-----------+----------+--------------+-----------+----------+--------------+ | 1 | 1 | NULL | 1 | 1 | 2007-03-01 | | 1 | 2 | NULL | NULL | NULL | NULL | | 1 | 3 | 2007-01-01 | NULL | NULL | NULL | +-----------+----------+--------------+-----------+----------+--------------+ 3 rows in set (0.00 sec) なので結合する前に絞っておきます。 SELECT * FROM Tenants T1 LEFT OUTER JOIN (SELECT * FROM RentPayments WHERE payment_date = 2007-03-01 and payment_date 2007-03-31 ) RP1 ON T1.tenant_id = RP1.tenant_id AND T1.unit_nbr=RP1.unit_nbr; +-----------+----------+--------------+-----------+----------+--------------+ | tenant_id | unit_nbr | vacated_date | tenant_id | unit_nbr | payment_date | +-----------+----------+--------------+-----------+----------+--------------+ | 1 | 1 | NULL | 1 | 1 | 2007-03-01 | | 1 | 2 | NULL | NULL | NULL | NULL | | 1 | 3 | 2007-01-01 | NULL | NULL | NULL | | 1 | 4 | NULL | NULL | NULL | NULL | +-----------+----------+--------------+-----------+----------+--------------+ 4 rows in set (0.00 sec) これで期間内に支払していない部屋番号4がちゃんと出てくるようになります。 というわけで答えは以下の通り。 SELECT * FROM Units U1 JOIN (Tenants T1 LEFT OUTER JOIN (SELECT * FROM RentPayments WHERE payment_date = 2007-03-01 and payment_date 2007-03-31 ) RP1 ON T1.tenant_id=RP1.tenant_id AND T1.unit_nbr=RP1.unit_nbr) ON U1.unit_nbr = T1.unit_nbr WHERE T1.vacated_date IS NULL ORDER BY U1.unit_nbr, RP1.payment_date; +------------+----------+-----------+----------+--------------+-----------+----------+--------------+ | complex_id | unit_nbr | tenant_id | unit_nbr | vacated_date | tenant_id | unit_nbr | payment_date | +------------+----------+-----------+----------+--------------+-----------+----------+--------------+ | 32 | 1 | 1 | 1 | NULL | 1 | 1 | 2007-03-01 | | 32 | 2 | 1 | 2 | NULL | NULL | NULL | NULL | | 32 | 4 | 1 | 4 | NULL | NULL | NULL | NULL | +------------+----------+-----------+----------+--------------+-----------+----------+--------------+ 3 rows in set (0.00 sec) fumikoさんの回答 2008年04月01日13時24分21秒.pdf 問題の意図がつかめなかったので、解答もちょっとむにゃむにゃになってしまったようです。 書籍の解答例を見て 回答例は1つしかなかったが、これだと期間外に支払があった場合のタプルがなくなってしまうのでは?(chiemin) ただしchieminの解答では現在借主がいない部屋が出てこない(chiaki) でも入居してないんだから出てこなくてもいいのでは(chiemin) とりあえず入居してない部屋も出てくるようにしてみた。 SELECT * FROM (Units U1 LEFT JOIN Tenants T1 ON U1.unit_nbr = T1.unit_nbr AND T1.vacated_date IS NULL AND U1.complex_id=32) LEFT OUTER JOIN (SELECT * FROM RentPayments WHERE payment_date= 2007-03-01 and payment_date 2007-03-31 ) RP1 ON T1.tenant_id=RP1.tenant_id AND U1.unit_nbr=RP1.unit_nbr ORDER BY U1.unit_nbr,RP1.payment_date; +------------+----------+-----------+----------+--------------+-----------+----------+--------------+ | complex_id | unit_nbr | tenant_id | unit_nbr | vacated_date | tenant_id | unit_nbr | payment_date | +------------+----------+-----------+----------+--------------+-----------+----------+--------------+ | 32 | 1 | 1 | 1 | NULL | 1 | 1 | 2007-03-01 | | 32 | 2 | 1 | 2 | NULL | NULL | NULL | NULL | | 32 | 3 | NULL | NULL | NULL | NULL | NULL | NULL | | 32 | 4 | 1 | 4 | NULL | NULL | NULL | NULL | +------------+----------+-----------+----------+--------------+-----------+----------+--------------+ 4 rows in set (0.00 sec) 現在入居者のいないunits_nbr=3の部屋も出てくるようになりました。 コメント 名前 コメント すべてのコメントを見る
https://w.atwiki.jp/sqlpuzzle/pages/26.html
問題 SalesData 売上データ (district_nbr 地区番号, sales_person セールスマン, sales_id セールスID, sales_amt 売上高) 「各地域で上位3位の好成績を上げたセールスマンのレポートを作成する」 サンプルデータ: district_nbr | sales_person | sales_id | sales_amt --------------+-----------------+----------+----------- 1 | カーリー | 5 | 3.00 1 | ハーポ | 11 | 4.00 1 | ラリー | 1 | 50.00 1 | ラリー | 2 | 50.00 1 | ラリー | 3 | 50.00 1 | モー | 4 | 5.00 2 | ディック | 8 | 5.00 2 | フレッド | 7 | 5.00 2 | ハリー | 6 | 5.00 2 | トム | 7 | 5.00 3 | アーヴィン | 10 | 5.00 3 | メルヴィン | 9 | 7.00 4 | ジェニー | 15 | 20.00 4 | ジェシー | 16 | 10.00 4 | メアリー | 12 | 50.00 4 | オプラ | 14 | 30.00 4 | サリー | 13 | 40.00 yukaさんの回答 fumikoの回答 SQL文 CREATE VIEW ss (district_nbr,sales_person,sum_sales_amt) AS SELECT district_nbr,sales_person,sum(sales_amt)as sum_sales_amt FROM salesdata GROUP BY sales_person,district_nbr ORDER BY district_nbr ,sum_sales_amt desc CREATE VIEW ss2 (district_nbr,sales_person,sum_sales_amt) AS SELECT s1.district_nbr, s1.sales_person, (SELECT (case when count(s2.sum_sales_amt) = 0 then s1.sum_sales_amt when count(s2.sum_sales_amt) = 1 then s1.sum_sales_amt when count(s2.sum_sales_amt) = 2 then s1.sum_sales_amt else null end) FROM ss as s2 WHERE s1.sum_sales_amt s2.sum_sales_amt and s1.district_nbr = s2.district_nbr) as sum_sales_amt FROM ss as s1 GROUP BY s1.district_nbr,s1.sales_person,s1.sum_sales_amt ORDER BY s1.district_nbr,s1.sum_sales_amt desc) as ss2 SELECT district_nbr,sales_person,sum_sales_amt FROM ss2 WHERE sum_sales_amt IS NOT NULL 結果 district_nbr | sales_person | sum_sales_amt --------------+-----------------+--------------- 1 | ラリー | 150.00 1 | モー | 5.00 1 | ハーポ | 4.00 2 | ハリー | 5.00 2 | フレッド | 5.00 2 | ディック | 5.00 2 | トム | 5.00 3 | メルヴィン | 7.00 3 | アーヴィン | 5.00 4 | メアリー | 50.00 4 | サリー | 40.00 4 | オプラ | 30.00 考え ビュー作成:personごとに売上合計を集計したテーブル district_nbr | sales_person | sum_sales_amt --------------+-----------------+--------------- 1 | ラリー | 150.00 1 | カーリー | 3.00 1 | ハーポ | 4.00 1 | モー | 5.00 2 | フレッド | 5.00 2 | トム | 5.00 2 | ディック | 5.00 2 | ハリー | 5.00 3 | アーヴィン | 5.00 3 | メルヴィン | 7.00 4 | サリー | 40.00 4 | オプラ | 30.00 4 | ジェニー | 20.00 4 | ジェシー | 10.00 4 | メアリー | 50.00 相関副問い合わせ&自己結合自己結合 売上合計が一方より大きく、地区番号が等しいという条件で 例:地区番号1の場合 sales_person | sum_sales_amt | sales_person | sum_sales_amt -----------------+---------------+-----------------+--------------- ハーポ | 4.00 | ラリー | 150.00 ハーポ | 4.00 | モー | 5.00 カーリー | 3.00 | ハーポ | 4.00 カーリー | 3.00 | ラリー | 150.00 カーリー | 3.00 | モー | 5.00 モー | 5.00 | ラリー | 150.00 地区番号、セールスマンごとにグループ化しする count(s2.sales_person)が0~2の場合は上位三位である